#include <unistd.h>

#include <cstdio>
#include <cstdlib>
#include <cstring>
int main() {
    //============进程间通信方式：无名管道===============
    // 1. 没有名字，无法使用open
    // 2. 只能用于亲缘进程之间，比如父子，兄弟，祖孙进程
    // 3. 半双工工作方式，读写分开
    // 4. 写入操作不具有原子性，只能用于一对一的简单通信情形
    // 5. 不能使用lseek来定位

    int pipe_fd[2];
    if (pipe(pipe_fd)) {
        perror("pipe error");
        return -1;
    }

    char *buff = (char *)calloc(1, 1024);
    int pid = fork();
    if (pid > 0) {
        while (1) {
            printf("父进程=>>请输入：\n");
            fgets(buff, 1024, stdin);
            int ret_val = write(pipe_fd[1], buff, strlen(buff));
            printf("成功写入%d字节\n", ret_val);

            ret_val = read(pipe_fd[0], buff, 1024);
            printf("父进程=>成功读取%d字节，内容：%s\n", ret_val, buff);
        }
    }
    if (pid == 0) {
        while (1) {
            int ret_val = read(pipe_fd[0], buff, 1024);
            printf("子进程=>成功读取%d字节，内容：%s\n", ret_val, buff);

            printf("子进程=>>请输入：\n");
            fgets(buff, 1024, stdin);
            ret_val = write(pipe_fd[1], buff, strlen(buff));
            printf("成功写入%d字节\n", ret_val);
        }
    }
}
